﻿using System.Collections.Generic;
using CTS.Com.Domain.Helper;
using CTS.Data.APMenus.Domain.Dao;
using CTS.Data.Domain.Entity;
using CTS.Data.Domain.Model;

namespace CTS.Data.APMenus.Domain.Utils
{
    public class MenuCom
    {
        private readonly MenuComDao _comDao;
        public MenuCom() { _comDao = new MenuComDao(); }

        /// <summary>
        /// Kiểm tra tồn tại menu
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="menuCd">Mã menu</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>True/False</returns>
        public bool IsExist(string localeCd, string appCd, string menuCd, bool ignoreDeleteFlag)
        {
            // Trả về true trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(appCd)
                || DataCheckHelper.IsNull(menuCd)) {
                return true;
            }
            // Kết quả trả về
            return _comDao.IsExist(localeCd, appCd, menuCd, ignoreDeleteFlag); ;
        }

        /// <summary>
        /// Lấy thông tin menu
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="menuCd">Mã menu</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Thông tin menu</returns>
        public MenuInfo GetInfo(string localeCd, string appCd, string menuCd, bool ignoreDeleteFlag)
        {
            // Trả về null trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(appCd)
                || DataCheckHelper.IsNull(menuCd)) {
                return null;
            }
            // Lấy thông tin
            var dataInfo = _comDao.GetInfo(localeCd, appCd, menuCd, ignoreDeleteFlag);
            // Kết quả trả về
            return DataHelper.CopyObject<MenuInfo>(dataInfo);
        }

        /// <summary>
        /// Lấy danh sách menu
        /// </summary>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách menu</returns>        
        public IList<MenuInfo> GetList(bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<MenuInfo>();
            // Lấy danh sách menu
            var listInfo = _comDao.GetList(ignoreDeleteFlag);
            // Diệt danh sách menu
            foreach (var info in listInfo) {
                listResult.Add(DataHelper.CopyObject<MenuInfo>(info));
            }
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách menu
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách menu</returns>        
        public IList<MenuInfo> GetList(string localeCd, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<MenuInfo>();
            // Lấy danh sách menu
            var listInfo = _comDao.GetList(localeCd, ignoreDeleteFlag);
            // Diệt danh sách menu
            foreach (var info in listInfo) {
                listResult.Add(DataHelper.CopyObject<MenuInfo>(info));
            }
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách menu
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách menu</returns>        
        public IList<MenuInfo> GetList(string localeCd, string appCd, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<MenuInfo>();
            // Lấy danh sách menu
            var listInfo = _comDao.GetList(localeCd, appCd, ignoreDeleteFlag);
            // Diệt danh sách menu
            foreach (var info in listInfo) {
                listResult.Add(DataHelper.CopyObject<MenuInfo>(info));
            }
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách menu
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách menu</returns>        
        public IList<MenuObject> GetListWithArgs(string localeCd, string appCd, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<MenuObject>();
            var menuArgCom = new MenuArgCom();
            // Lấy danh sách menu
            var listInfo = GetList(localeCd, appCd, ignoreDeleteFlag);
            // Khai báo biến dùng trong loop
            MenuObject menuObject;
            // Diệt danh sách menu
            foreach (var info in listInfo) {
                // Tạo đối tượng menu
                menuObject = new MenuObject();
                // Gán thông tin menu vào đối tượng menu
                menuObject.Menu = info;
                // Lấy và gán arg vào đối tượng menu
                menuObject.Args = menuArgCom.GetList(info.MenuCd, ignoreDeleteFlag);
                // Thêm đối tượng menu vào danh sách kết quả
                listResult.Add(menuObject);
            }
            // Kết quả trả về
            return listResult;
        }
    }
}
